package n2_common_methods;

import lombok.extern.slf4j.Slf4j;

/**
 * sleep 之后
 *  使用 getState() 得到几种状态   NEW   RUNNABLE(就绪)   TIMED_WAITING    TERMINATED
 *
 */
@Slf4j(topic = "c.")
public class T2_线程各种状态_and_preventCpu100 {

    public static void main(String[] args) {
        final Thread t1 = new Thread("t1") {
            @Override
            public void run() {

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        log.debug("start 之前 ：  {}", t1.getState());     // NEW
        t1.start();
        log.debug("start之后查看 t1线程状态：  {}", t1.getState());  // RUNNABLE
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.debug("主线程休眠500毫秒后，此时t1线程还在休眠中 状态： {}", t1.getState()); // TIMED_WAITING


        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.debug("主线程休眠3000毫秒后 t1线程状态：  {}", t1.getState()); // TERMINATED
    }

    /**
     * 在没有利用 cpu 来计算时，不要让 while(true) 空转浪费 cpu，
     * 这时可以使用 yield 或 sleep 来让出 cpu 的使用权 给其他程序
     */
    private static class sleep100cpu{


        public static void main(String[] args) {

//            useSleep();
            useWait();

        }

        // sleep 适用于无需锁同步的场景
        public static void useSleep(){
            while(true){
                log.debug(" while---true ......");
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        /**
         * 可以用 wait 或 条件变量达到类似的效果
         * 不同的是，后两种都需要加锁，并且需要相应的唤醒操作，一般适用于要进行同步的场景
         */
        public static void useWait(){
//            synchronized(锁对象) {
//                while(条件不满足) {
//                    try {
//                        锁对象.wait();
//                    } catch(InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
//                // do sth...
//            }

        }

    }

}
